#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>                  // Qt基础窗口类
#include <QSerialPort>              // 串口通信类
#include <QTimer>                   // 定时器类，用于定时发送等功能
#include <QPushButton>              // 按钮控件类
#include <QCheckBox>
#include "mycombobox.h"             // 自定义下拉框控件（可能用于串口选择等）
#include "customthread.h"

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }      // 声明 UI 命名空间，包含界面元素指针
QT_END_NAMESPACE

/**
 * 主窗口类 Widget，继承自 QWidget
 * 实现串口调试助手的核心功能：串口通信、数据收发、定时发送、数据显示等
 */
class Widget : public QWidget
{
    Q_OBJECT        // 启用 Qt 的信号与槽机制

public:
    /**
     * 构造函数
     * 初始化界面和串口对象等
     * @param parent 父级窗口指针，默认为 nullptr
     */
    Widget(QWidget *parent = nullptr);

    /**
     * 析构函数
     * 清理资源，释放内存
     */
    ~Widget();

private slots:
    /**
     * 打开/关闭串口按钮点击事件处理函数
     */
    void on_btnCloseOrOpenSerial_clicked();

    /**
     * 发送数据按钮点击事件处理函数
     */
    void on_btnSendContext_clicked();

    /**
     * 串口有数据可读时的处理函数（当串口接收到数据时触发）
     */
    void on_SerialData_readyToRead();

    /**
     * 打开/关闭串口按钮的状态切换事件处理函数（带 checked 参数）
     * @param checked 当前按钮是否被选中
     */
    void on_btnCloseOrOpenSerial_clicked(bool checked);

    /**
     * 定时发送复选框点击事件处理函数
     * @param checked 是否启用定时发送
     */
    void on_checkBSendInTime_clicked(bool checked);

    /**
     * 接收区清空按钮点击事件处理函数
     * @param checked （参数存在但可能未使用）
     */
    void on_btnrevClear_clicked();

    /**
     * 接收数据保存按钮点击事件处理函数
     * @param checked （参数存在但可能未使用）
     */
    void on_btnrevSave_clicked();

    /**
     * 定时器超时刷新函数，用于更新时间或执行定时任务
     */
    void time_reflash();

    /**
     * 十六进制显示复选框点击事件处理函数
     * @param checked 是否启用十六进制显示模式
     */
    void on_checkBHexDisplay_clicked(bool checked);

    /**
     * 隐藏设置区域按钮点击事件处理函数
     * @param checked 是否隐藏该区域
     */
    void on_btnhideTable_clicked(bool checked);

    /**
     * 隐藏历史记录按钮点击事件处理函数
     * @param checked 是否隐藏历史记录区域
     */
    void on_btnHideHistory_clicked(bool checked);

    /**
     * 刷新串口名称列表函数
     * 获取系统当前所有可用串口并更新到下拉框中
     */
    void refreshSerialName();

    /**
     * 自定义命令按钮点击事件处理函数
     * 用于统一处理多个预设发送按钮的点击操作
     */
    void on_command_button_clicked();

    void on_checkBox_send_clicked(bool checked);

    void buttons_handler();

    void on_btnInit_clicked();

    void on_btnSave_clicked();

    void on_btnLoad_clicked();

private:
    Ui::Widget *ui;                     // 自动生成的界面元素指针
    QSerialPort *serialPort;            // 串口对象，用于串口通信
    int writeCntTotal;                  // 总共发送的数据字节数
    int readCntTotal;                   // 总共接收的数据字节数
    QString sendBak;                    // 发送数据备份，可能用于重发或记录
    QString myTime;                     // 当前系统时间字符串，用于日志或显示
    bool serialStatus;                  // 当前串口连接状态（打开/关闭）
    QTimer *timer;                      // 定时器对象，用于定时发送等功能

    /**
     * 获取系统当前时间，并格式化为字符串
     */
    void getSysTime();
    QTimer *buttonsConTimer;
    int buttonIndex;
    CustomThread *myThread;

    /**
     * 定义一个 QPushButton 指针列表，用于保存找到的按钮对象
     * 可用于统一设置属性、连接信号槽等操作
     */
    QList<QPushButton *> buttons;
    QList<QLineEdit *> lineEdits;
    QList<QCheckBox *> checkBoxs;


};

#endif // WIDGET_H
